K3s 使用 drone 搭建 CICD
绑定 GitHub 仓库
登录 GitHub,在 https://github.com/settings/applications/new (opens new window)新建一个应用。
接下来查看这个应用的详情,记录 Client ID 和 Client Secret,之后配置 Drone 会用到
安装 drone
# 添加 Drone 的 Helm 仓库
helm repo add drone https://charts.drone.io
helm repo update
# 安装 Drone
helm install --namespace drone --create-namespace --wait drone drone/drone \
--set env.DRONE_SERVER_HOST=your-drone-server-host \
--set env.DRONE_SERVER_PROTO=http \
--set env.DRONE_GITHUB_CLIENT_ID=your-github-client-id \
--set env.DRONE_GITHUB_CLIENT_SECRET=your-github-client-secret \
--set env.DRONE_RPC_SECRET=your-secret-key
# 使用命名空间访问公共的代理 Pod
注意!!! 国内的这个网络,不挂代理是基本无法访问 Github 的,所以这里还需要加上代理
如果要卸载的话
helm uninstall drone --namespace drone
使用 Helm 安装的 Drone 的配置可以通过修改 Helm 的 values 文件来进行更新。以下是修改 Drone 配置的一般步骤:
从当前运行中的 Drone Helm release 中导出配置。
helm list
helm get values drone --namespace drone > drone-values.yaml
然后修改了 drone-values.yaml 文件后,使用 helm upgrade 命令来更新 Drone:
helm upgrade drone drone/drone --namespace drone -f drone-values.yaml
# drone-values.yaml
# ...
env:
HTTP_PROXY: "http://v2ray-proxy-service.common-namespace.svc.cluster.local:1081"
HTTPS_PROXY: "http://v2ray-proxy-service.common-namespace.svc.cluster.local:1081"
NO_PROXY: ".your-internal-domain.com,localhost,127.0.0.1"
自定义模板
如果需要自定义模板,使用 Helm 自带的 pull 命令来下载 Chart 包,并使用tar命令解压它:
helm pull drone/drone
tar -zxvf drone-0.6.5.tgz
修改完成后,你可以选择将Helm Chart打包回.tgz格式:
helm package path/to/your/chart -d path/to/destination
安装或升级Helm Chart
helm install release-name path/to/your/chart
# 或者
helm upgrade release-name path/to/your/chart
绑定 Gogs 仓库
helm install --namespace drone --create-namespace --wait drone drone/drone \
--set env.DRONE_SERVER_HOST=your-drone-server-host \
--set env.DRONE_SERVER_PROTO=http \
--set env.DRONE_GOGS_SERVER=https://gogs.quicktoolset.top \
--set env.DRONE_RPC_SECRET=your-secret-key
# 或者指定 value 文件安装
helm install drone -f path/to/your/values.yaml drone/drone --namespace drone
- 登录 drone 激活仓库
- 在仓库创建 .drone.yml 文件
- 检查仓库的 webhooks 配置是否正常
激活之后,自动就会在 gogs 仓库的 Web 设置中创建钩子
当不存在 .drone.yml
文件或者仓库没有在 drone 激活,测试返回的报文可能是 dial tcp 连接失败。
配置构建机器
创建一个配置文件 drone-runner-values.yaml:
service:
type: LoadBalancer
env:
DRONE_RPC_PROTO: http
DRONE_RPC_HOST: drone:8080
DRONE_RPC_SECRET: your-secret-key # 与 Drone Server 中的 DRONE_RPC_SECRET 一致
使用 Helm 安装 Drone Runner:
helm install drone-runner drone/drone-runner-kube -f drone-runner-values.yaml --namespace drone
# 更新
helm upgrade drone-runner drone/drone-runner-kube -f drone-runner-values.yaml --namespace drone
配置 Drone Pipeline
在你的 GitHub 仓库中创建一个 .drone.yml
文件,定义你的 CI/CD pipeline。
Drone 配置项
这里列了一些常用的配置项,更多配置项请参考 Drone 官方文档 (opens new window)。
kind: pipeline # 定义这是一个pipeline
type: docker # 或者 kubernetes, exec
name: default # pipeline的名字
steps: # 定义执行的步骤
- name: build # 步骤的名字
image: golang:1.15 # 使用的docker镜像
commands: # 执行的命令
- go build
- go test
- name: docker # 步骤的名字
image: plugins/docker # 使用的docker插件,用于构建和推送docker镜像
settings: # 插件的配置
username: your-dockerhub-username # Docker Hub 用户名
password: your-dockerhub-password # Docker Hub 密码或访问令牌
repo: your-dockerhub-username/your-repo # Docker 镜像的仓库名
tags: latest # 镜像的标签
- name: notify # 步骤的名字
image: plugins/slack # 使用的slack通知插件
settings: # 插件的配置
channel: general # Slack 频道
webhook: your-slack-webhook-url # Slack 的 Webhook URL
services: # 定义服务(如数据库等),这些服务在整个pipeline运行期间可用
- name: database # 服务的名字
image: postgres # 使用的docker镜像
environment: # 环境变量
POSTGRES_DB: test # 数据库名
POSTGRES_USER: user # 数据库用户名
POSTGRES_PASSWORD: password # 数据库密码
trigger: # 定义触发pipeline的条件
branch: # 定义哪些分支会触发pipeline
- master # master分支会触发
- feature/* # 所有以"feature/"开头的分支会触发
depends_on: # 定义pipeline的依赖关系,即当前pipeline依赖哪些其他pipeline
- other-pipeline # 依赖名为"other-pipeline"的pipeline
volumes: # 定义卷,用于在步骤之间共享数据
- name: cache # 卷的名字
host: # 宿主机卷类型
path: /var/lib/drone/cache # 卷在宿主机上的路径
---
kind: secret # 定义这是一个secret
type: docker # 定义secret的类型,这里是docker
name: docker_username # secret的名字
get:
path: org/repo
name: docker_username # secret在密钥管理系统中的名字
跑流水线无法运行,提示 Pending
检查 Runner 日志,是否成功连接 Server
检查 Server 数据库文件是否成功创建
检查 .drone.yml
配置参数是否正确,type 是否与 Runner type 一致
关于 Pending,可以看下官方的一篇帖子:Builds are Stuck in Pending Status。
配置自签 CA 到镜像里面
USER-SUPPLIED VALUES:
env:
DRONE_SERVER_HOST: drone.quicktoolset.top
DRONE_SERVER_PROTO: https
DRONE_RPC_SECRET: xxxxxxxxx
NO_PROXY: "drone.quicktoolset.top,localhost,127.0.0.1"
DRONE_GOGS_SERVER: https://gogs.quicktoolset.top
DRONE_GOGS_SKIP_VERIFY: true
DRONE_TRACE: true # 打开调试日志
extraVolumes:
- name: custom-certs
secret:
secretName: internal-ca-key-pair
items:
- key: tls.crt
path: tls.crt
extraVolumeMounts:
- name: custom-certs
mountPath: /etc/ssl/certs/tls.crt
subPath: tls.crt
readOnly: true
再更新一下
# 更新
helm upgrade drone-runner drone/drone-runner-kube -f drone-runner-values.yaml --namespace drone
然后还需要给构建机器添加一个环境变量
DRONE_RUNNER_VOLUMES=/etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt